package cn.david.basic.service.impl;


import cn.david.basic.constant.UserConstants;
import cn.david.basic.exception.BusinessExcepiton;
import cn.david.basic.service.IVerifyCodeService;
import cn.david.basic.util.StrUtils;
import cn.david.user.domian.User;
import cn.david.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void sendSmsCode(Map<String,String> map) {
        String phone = map.get("phone");
        String type = map.get("type");
        //1.校验
        //1.1 手机号空校验
        if (phone==null ||phone.length()==0){
            throw new BusinessExcepiton("手机号码不能为空");
        }
        if ("register".equals(type)){
            //1.2 手机号是否被注册==？？？？
            User user = userMapper.loadByphone(phone);
            if (user!=null){
                throw new BusinessExcepiton("手机以注册请直接登录");
            }
            String businessKey =UserConstants.USER_REGISTER_CODE_PREFIX + phone;
            sendSmsCode(businessKey);
        }else if ("binder".equals(type)){
            String businessKey =UserConstants.BINDER_CODE_PREFIX + phone;
            sendSmsCode(businessKey);


        }


    }
    public void sendSmsCode(String businessKey){
        //2.判断验证码是否存在  （从redis中拿 key：  业务code:phone）
        Object o = redisTemplate.opsForValue().get(businessKey);
        //2.1 如果存在
        String code= null;
        if (o!=null){
            //把OBJ转string
            String codes =(String)o;
            //2.1.1 判断是否过了重发时间（value：  VerifyCode:time）
            Long thr=Long.valueOf(codes.split(":")[1]);
            if (System.currentTimeMillis()-thr<60*1000) {
                //2.1.1.1 如果没过  直接抛业务异常：请勿重复发送验证码
                throw new BusinessExcepiton("验证码以发送，请勿重复发送");

            }
            //2.1.1.2 如果过了重发时间（还未过有效期）   使用原来还没有过期的验证码 （放到下面去刷新）
            code=codes.split(":")[0];


        }//2.2 不存在
        //2.2.1 生成新的验证码
        code = StrUtils.getRandomString(5);

        //3.存储redis，并设置过期时间
        redisTemplate.opsForValue().set(businessKey, code+":"+System.currentTimeMillis(), 3, TimeUnit.MINUTES);
        //4.调用短信接口，发送验证码
        //SmsUtils.send(phone, "验证码:"+code);
        System.out.println(code);

    }

}
